function Person(name, age) {
  this.name = name;
  this.age = age;
}

/**
 * 创建一个新的对象
 * 继承父类原型上的方法.
 * 添加父类的属性到新的对象上并初始化. 保存方法的执行结果.
 * 如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象。
 * @returns 
 */
function newObject() {
  let obj = {};
  var Constructor = Array.prototype.shift.apply(arguments);
  // 实例对象（object）都有一个私有属性（称之为 __proto__ ）指向它的构造函数的原型对象（prototype）
  obj.__proto__ = Constructor.prototype;
  // 添加属性到新创建的obj上, 并获取obj函数执行的结果.
  let res = Constructor.apply(obj, arguments);
  return typeof res == "object" ? res : obj;
}

let o1 = newObject(Person, "liming", 22);
console.log(o1);
